PageSpeed Insightsの指摘を元にCloudFrontの設定・利用状況を見直してみた
ウェブサイトのパフォーマンス改善のためにPageSpeed Insightsで分析している方は多いのではないかと思います。
本ブログでは、PageSpeed Insightsの改善項目のうち、Amazon CloudFrontを利用しているサイトに対してアクション可能な項目を4点紹介します。
1つは簡単な設定変更だけで済み、残り3つは遅い箇所にあたりをつけます。
端的には、ページサイズを小さくすることがゴールです。
サイズを小さくすることで、サービスを提供する側にとってはトラフィック量を軽減でき、利用する側にとってはページをより早く表示できるようになります。
事前準備
CloudFrontの利用状況を把握するためには、モニタリングやアクセスログがマストです。
まずはこれらを有効化します。
拡張モニタリングを有効化しよう
2019年12月に、以下のリアルタイムメトリックが追加されています。
- キャッシュヒット率
- オリジンのレイテンシー(TTFB)
- ステータスコード別のエラー率(401,403, 404, 502, 503, 504)
有効化しましょう。
CloudFrontのアクセスログをS3にエクスポートしよう
トラブルシュートや利用状況を把握するためにCloudFrontのアクセスログが必要です。
ストレージコスト軽減のために、一定期間が経過したアクセスログを削除するようS3のライフサイクルを設定しましょう。
S3 バケットのライフサイクルポリシーを作成する方法 - Amazon Simple Storage Service
アクセスログをAmazon AthenaでSQL分析できるようにしよう
Amazon Athenaを利用すると、S3にエクスポートしたアクセスログをSQLで探索的に分析できます。
ログを有効活用するためにも、次のドキュメントに従いAthena用にテーブル定義しましょう。
Amazon CloudFront ログのクエリ - Amazon Athena
ログフォーマットは、2019年12月に拡張されています。
拡張前にテーブル定義した場合は、再定義しましょう。
パフォーマンス観点では
- time-to-first-byte(TTFB)
- sc-content-type(コンテントタイプ)
を、トラブルシュート観点では
- x-edge-detailed-result-type(エラーの詳細タイプ)
を活用できるようになります。
PageSpeed Insightの提案をCloudFrontと付き合わせる
以下では、PageSpeed Insightの改善提案に対して、CloudFrontをどの設定したり、ログを調査すればよいのか解説します。
なお、CloudFrontとは直接関係のない提案は除外しています。
テキスト圧縮の有効化
指摘
テキストベースのリソースは圧縮(gzip、deflate、または brotli)して配信し、ネットワークの全体的な通信量を最小限に抑えてください。 詳細
対応
CloudFront ディストリビューションがコンテンツを圧縮するように設定します。
テキストベースのリソースを配信する各ディストリビューションに対して、「Compress objects automatically」を有効にしてgzip圧縮します。
次世代フォーマットでの画像の配信
指摘
JPEG 2000、JPEG XR、WebP などの画像フォーマットは、PNG や JPEG より圧縮性能が高く、ダウンロード時間やデータ使用量を抑えることができます。 詳細
対応
GIFやJPEGといった昔ながらの画像フォーマットで配信していることが考えられます。
配信している画像フォーマットをAthenaで確認します。
SELECT sc_content_type, count(*) cnt FROM cloudfront_logs WHERE strpos(sc_content_type, 'image/') > 0 AND date = DATE '2020-05-01' GROUP BY sc_content_type ORDER BY cnt desc
以下のような次世代フォーマットで配信されていたでしょうか?
フォーマット | Content-Type |
---|---|
JPEG 2000 | image/jp2 image/jpx |
JPEG XR | image/vnd.ms-photo image/jxr |
WebP | image/webp |
次世代の画像配信の注意点としては、ブラウザごとに対応しているフォーマットが異なっており、元画像からのフォーマット変換も必要なことです。
自社開発・運用するには潤沢なリソースが必要ですが、画像最適化SaaSを利用すること、簡単に次世代フォーマットで画像配信できます。
効率的な画像フォーマット
指摘
画像を最適化すると、読み込み時間を短縮しモバイルデータ量を抑えることができます。 詳細
対応
「次世代フォーマットでの画像の配信」との違いが気になります。 英語では「Efficiently encode images」となっており、オーバースペックな画質が問題視されています。
画像最適化SaaSを利用すると、ブラウザ・元画像にあわせて画質を最適化して配信できます。
サーバー応答時間の短縮(TTFB)
指摘
最初の 1 バイトまでの時間は、サーバーが応答を返すまでにかかった時間を表しています。 詳細
対応
この項目が指摘される場合、オリジンからのコンテンツ取得が遅いことを意味します。
リクエスト全体でならしたTTFBは CloudFront リアルタイムメトリクスのオリジンのレイテンシーで取得できているため、CloudFront アクセスログの28番目のフィールドの time-to-first-byte を利用してドリルダウンします。
CloudFrontのアクセスログに対してAthenaで問い合わせて、特に遅いリクエストを洗い出します。
次のSQLは、平均TTFBが1秒を超えるURIを抽出しています。
エッジ↔オリジン間の通信距離による遅延を排除するため、オリジンが東京リージョンにある前提で、日本のエッジサーバー(location=NRT*
)からのアクセスに限定しています。
SELECT uri, avg(time_to_first_byte) ttfb, count(*) cnt FROM cloudfront_logs WHERE status = 200 AND date = DATE '2020-05-01' AND strpos(location, 'NRT') > 0 -- 東京エッジからのアクセス AND result_type = 'Miss' -- オリジンにリクエスト GROUP BY uri HAVING avg(time_to_first_byte) > 1.0 ORDER BY ttfb desc
URI単位の代わりにBehavior単位にするなど、切り口をいろいろ変えてみてください。
遅いURIを特定したあとは
- アプリケーション処理
- サーバースペック
など、システム分析をしてTTFBを改善してください。
細かいことですがPageSpeed InsightsとCloudFrontではTTFBの起点が異なっていることにご注意ください。
CloudFrontのTTFBはあくまでもCloudFrontとオリジン間のTTFBであり、ドキュメントにあるように「サーバー上で測定される、要求を受信してから応答の最初のバイトを書き込むまでの秒数」です。
最後に
2019年12月にCloudFrontのアクセスログとリアルタイムメトリックが拡張され、CloudFrontの利用状況を把握しやすくなりました。
Webパフォーマンスに悩んでいる方は、PageSpeed Insightと併用して分析してみてはいかがでしょうか。